home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork2.lzh / サンプル基礎編 / ファイル操作 / FILE.C next >
Text File  |  1994-03-10  |  10KB  |  333 lines

  1. /******************************************************************************
  2.  *    file.c:        ファイル操作の処理関数
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <doslib.h>
  9. #include <event.h>        /* イベントマンを利用するときに必要    */
  10. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  11. #include <task.h>        /* タスクマンを利用するときに必要    */
  12. #include "file.h"        /* このプログラム固有のヘッダファイル    */
  13.  
  14. /******************************************************************************
  15.  *    copyProc():    コピーダイアログの処理
  16.  ******************************************************************************
  17.  *    引数:    ComVal *pcv    共通変数へのポインタ
  18.  *    戻り値:    BOOLEAN        = TRUE:  コピー処理成功
  19.  *                = FALSE: コピー処理失敗
  20.  */
  21. BOOLEAN copyProc(ComVal *pcv)
  22. {
  23.     int num, errCode, len, stat;
  24.     DlgPrm dp = {            /* ダイアログ処理用パラメータ    */
  25.         2, 16,
  26.         "ファイルのコピー",
  27.         "コピー元ファイル名",
  28.         "コピー先ファイル名"
  29.     };
  30.  
  31.     num = dialogProc(pcv, &dp);
  32.     if (num == 1) {            /* [実行]ボタンか?        */
  33.         /* コピー元ファイル名をチェックする */
  34.         errCode = checkDrive(pcv, (char *) &dp.src[1], 1);
  35.         if (errCode < 0) {
  36.             if (errCode == -4) /* ファイルが存在しないか?    */
  37.                 pcv->errorCode = -2;
  38.             return FALSE;
  39.         }
  40.  
  41.         /* コピー先ファイル名をチェックする */
  42.         errCode = checkDrive(pcv, (char *) &dp.dst[1], 1);
  43.         if (errCode >= 0) {    /* ファイルが存在するか?    */
  44.             num = DMError(D_EXEC, "同名のファイルが存在します。\r"
  45.                           "上書きしますか?");
  46.             if (num == 2)
  47.                 return TRUE;
  48.  
  49.         } else if (errCode == -4)
  50.             errCode = 0;
  51.         else
  52.             return FALSE;
  53.  
  54.         /* コピー元とコピー先のファイルが同一か? */
  55.         len = (dp.src[0] >= dp.dst[0]) ? dp.src[0] : dp.dst[0];
  56.         stat = SXStrCmp((char *) &dp.src[1], (char *) &dp.dst[1], len);
  57.         if (stat == 0) {
  58.              /* 同一ファイルへコピーしようとした */
  59.             pcv->errorCode = -22;
  60.             return FALSE;
  61.         }
  62.         /* 待ち状態を示すマウスポインタを表示する */
  63.         EMEnCross();
  64.         /* コピーする */
  65.         errCode = TSCopyP((char *) &dp.src[1], (char *) &dp.dst[1]);
  66.         /* 待ち状態を示すマウスポインタを元に戻す */
  67.         EMDeCross();
  68.         if (errCode < 0) {
  69.             pcv->errorCode = errCode;
  70.             return FALSE;
  71.         }
  72.     }
  73.     return TRUE;
  74. }
  75.  
  76. /******************************************************************************
  77.  *    renameProc():    ファイル名変更の処理
  78.  ******************************************************************************
  79.  *    引数:    ComVal *pcv    共通変数へのポインタ
  80.  *    戻り値:    BOOLEAN        = TRUE:  ファイル名変更成功
  81.  *                = FALSE: ファイル名変更失敗
  82.  */
  83. BOOLEAN renameProc(ComVal *pcv)
  84. {
  85.     int num, errCode;
  86.     DlgPrm dp = {            /* ダイアログ処理用パラメータ    */
  87.         2, 14,
  88.         "ファイル名変更",
  89.         "変更ファイル名",
  90.         "新規ファイル名"
  91.     };
  92.  
  93.     num = dialogProc(pcv, &dp);
  94.     if (num == 1) {
  95.         /* [実行]ボタンで終了 */
  96.         /* 変更ファイル名チェック */
  97.         errCode = checkDrive(pcv, (char *) &dp.src[1], 1);
  98.         if (errCode < 0) {
  99.             if (errCode == -4)
  100.                 /* ファイルが存在しない場合は終了 */
  101.                 pcv->errorCode = -2;
  102.             return FALSE;
  103.         }
  104.  
  105.         /* 新規ファイル名チェック */
  106.         errCode = checkDrive(pcv, (char *) &dp.dst[1], 1);
  107.         if (errCode >= 0) {
  108.             /* ファイルが存在する */
  109.             pcv->errorCode = -22;
  110.             return FALSE;
  111.  
  112.         } else if (errCode == -4)
  113.             errCode = 0;
  114.         else
  115.             return FALSE;
  116.  
  117.         /* 待ち状態を示すマウスポインタを表示する */
  118.         EMEnCross();
  119.         /* 名前を変更する */
  120.         errCode = TSMoveP((char *) &dp.src[1], (char *) &dp.dst[1]);
  121.         /* 待ち状態を示すマウスポインタを元に戻す */
  122.         EMDeCross();
  123.         if (errCode < 0) {
  124.             pcv->errorCode = errCode;
  125.             return FALSE;
  126.         }
  127.     }
  128.     return TRUE;
  129. }
  130.  
  131. /******************************************************************************
  132.  *    deleteProc():    ファイル削除の処理
  133.  ******************************************************************************
  134.  *    引数:    ComVal *pcv    共通変数へのポインタ
  135.  *    戻り値:    BOOLEAN        = TRUE:  ファイル削除成功
  136.  *                = FALSE: ファイル削除失敗
  137.  */
  138. BOOLEAN deleteProc(ComVal *pcv)
  139. {
  140.     int num, errCode;
  141.     char str[64];
  142.     char drv[2], path[65], node[19], ext[5];
  143.     DlgPrm dp = {            /* ダイアログ処理用パラメータ    */
  144.         1, 12,
  145.         "ファイル削除",
  146.         "削除ファイル名"
  147.     };
  148.  
  149.     num = dialogProc(pcv, &dp);
  150.     if (num == 1) {
  151.         /* [実行]ボタンで終了 */
  152.         /* 変更ファイル名チェック */
  153.         errCode = checkDrive(pcv, (char *) &dp.src[1], 1);
  154.         if (errCode < 0) {
  155.             if (errCode == -4)
  156.                 /* ファイルが存在しない場合は終了 */
  157.                 pcv->errorCode = -2;
  158.             return FALSE;
  159.         }
  160.  
  161.         /* フルパス名よりファイル名だけ抽出 */
  162.         strsfn((char *) &dp.src[1], drv, path, node, ext);
  163.         sprintf(str, "ファイル %s.%s\rを削除します。\0", node, ext);
  164.         /* ファイルの削除の確認 */
  165.         num = DMError(D_EXEC, str);
  166.         if (num == 2)
  167.             return TRUE;
  168.  
  169.         /* 待ち状態を示すマウスポインタを表示する */
  170.         EMEnCross();
  171.         /* ファイルを削除する */
  172.         errCode = TSDeleteP((char *) &dp.src[1]);
  173.         /* 待ち状態を示すマウスポインタを元に戻す */
  174.         EMDeCross();
  175.         if (errCode < 0) {
  176.             pcv->errorCode = errCode;
  177.             return FALSE;
  178.         }
  179.     }
  180.     return TRUE;
  181. }
  182.  
  183. /******************************************************************************
  184.  *    mkdirProc():    ディレクトリ作成の処理
  185.  ******************************************************************************
  186.  *    引数:    ComVal *pcv    共通変数へのポインタ
  187.  *    戻り値:    BOOLEAN        = TRUE:  ディレクトリ作成成功
  188.  *                = FALSE: ディレクトリ作成失敗
  189.  */
  190. BOOLEAN mkdirProc(ComVal *pcv)
  191. {
  192.     int num, errCode;
  193.     DlgPrm dp = {            /* ダイアログ処理用パラメータ    */
  194.         1, 16,
  195.         "ディレクトリ作成",
  196.         "ディレクトリ名"
  197.     };
  198.  
  199.     num = dialogProc(pcv, &dp);
  200.     if (num == 1) {
  201.         /* [実行]ボタンで終了 */
  202.         /* ディレクトリ名チェック */
  203.         errCode = checkDrive(pcv, (char *) &dp.src[1], 0x80 + 1);
  204.         if (errCode >= 0) {
  205.             /* ディレクトリが存在する場合は終了 */
  206.             pcv->errorCode = -20;
  207.             return FALSE;
  208.  
  209.         } else if (errCode == -4)
  210.             errCode = 0;
  211.         else
  212.             /* その他のエラー */
  213.             return FALSE;
  214.  
  215.         /* 待ち状態を示すマウスポインタを表示する */
  216.         EMEnCross();
  217.         /* ディレクトリを作成する */
  218.         errCode = TSMkDirP((char *) &dp.src[1]);
  219.         /* 待ち状態を示すマウスポインタを元に戻す */
  220.         EMDeCross();
  221.         if (errCode < 0) {
  222.             pcv->errorCode = errCode;
  223.             return FALSE;
  224.         }
  225.     }
  226.     return TRUE;
  227. }
  228.  
  229. /******************************************************************************
  230.  *    rmdirProc():    ディレクトリ削除の処理
  231.  ******************************************************************************
  232.  *    引数:    ComVal *pcv    共通変数へのポインタ
  233.  *    戻り値:    BOOLEAN        = TRUE:  ディレクトリ削除成功
  234.  *                = FALSE: ディレクトリ削除失敗
  235.  */
  236. BOOLEAN rmdirProc(ComVal *pcv)
  237. {
  238.     int num, errCode;
  239.     char str[64];
  240.     char drv[2], path[65], node[19], ext[5];
  241.     DlgPrm dp = {            /* ダイアログ処理用パラメータ    */
  242.         1, 16,
  243.         "ディレクトリ削除",
  244.         "ディレクトリ名"
  245.     };
  246.  
  247.     num = dialogProc(pcv, &dp);
  248.     if (num == 1) {
  249.         /* [実行]ボタンで終了 */
  250.         /* ディレクトリ名チェック */
  251.         errCode = checkDrive(pcv, (char *) &dp.src[1], 0x80 + 1);
  252.         if (errCode < 0) {
  253.             if (errCode == -4)
  254.                 /* ディレクトリが存在しない場合は終了 */
  255.                 pcv->errorCode = -3;
  256.             return FALSE;
  257.         }
  258.  
  259.         /* フルパス名よりファイル名だけ抽出 */
  260.         strsfn((char *) &dp.src[1], drv, path, node, ext);
  261.         sprintf(str, "ディレクトリ %s\rを削除します。\0", node);
  262.         /* ファイルの削除の確認 */
  263.         num = DMError(D_EXEC, str);
  264.         if (num == 2)
  265.             return TRUE;
  266.  
  267.         /* 待ち状態を示すマウスポインタを表示する */
  268.         EMEnCross();
  269.         /* ディレクトリを削除する */
  270.         errCode = TSRmDirP((char *) &dp.src[1]);
  271.         /* 待ち状態を示すマウスポインタを元に戻す */
  272.         EMDeCross();
  273.         if (errCode < 0) {
  274.             pcv->errorCode = errCode;
  275.             return FALSE;
  276.         }
  277.     }
  278.     return TRUE;
  279. }
  280.  
  281. /******************************************************************************
  282.  *    checkDrive():    指定ファイル名のドライブをチェック
  283.  ******************************************************************************
  284.  *    引数:    ComVal *pcv    共通変数へのポインタ
  285.  *        char *fname    ファイル名へのポインタ
  286.  *        int mode    検査するモード(+0x80 で、ディレクトリの検査)
  287.  *                =  0: 書き込み
  288.  *                =  1: 読み込み
  289.  *    戻り値:    int        >= 0: 読み込み成功
  290.  *                = -1: ファイル名が正しくない
  291.  *                = -2: ドライブの準備ができていない
  292.  *                = -3: 書き込み禁止がされている
  293.  *                = -4: ファイルが存在しない
  294.  */
  295. int checkDrive(ComVal *pcv, char *fname, int mode)
  296. {
  297.     int att, stat, errCode;
  298.     struct NAMECKBUF nminf;
  299.     struct FILBUF filbuf;        /* ファイル情報            */
  300.  
  301.     /* ディレクトリとしてチェックするか? */
  302.     att = (mode & 0x80) ? TS_SUBDIR : TS_ARCH;
  303.     mode &= 1;
  304.     /* 入力されたファイル名を分解・検査する */
  305.     stat = NAMECK((unsigned char *) fname, &nminf);
  306.     if (stat != 0) {
  307.         pcv->errorCode = -13;    /* ファイル名が正しくない    */
  308.         return -1;
  309.     }
  310.     /* フルパス名を作成する */
  311.     strmfn(fname, (char *) nminf.drive, (char *) nminf.path, (char *) nminf.name, (char *) nminf.ext);
  312.  
  313.     /* 指定ファイル名のドライブの状態を取得する */
  314.     stat = TSDrvctrl(0, nminf.drive[0] & 0x1f);
  315.     if ((stat & 0x06) != 0x02) {    /* ドライブが準備されているか?    */
  316.         pcv->errorCode = 15;    /* 準備できていない        */
  317.         return -2;
  318.     }
  319.     /* ライトプロテクトされているか? */
  320.     if (mode == 0 && (stat & 0x0a) == 0x0a) {
  321.         pcv->errorCode = 16;    /* プロテクトされている        */
  322.         return -3;
  323.     }
  324.     /* ファイルの存在のチェック */
  325.     errCode = TSFiles(&filbuf, fname, att);
  326.     if (errCode < 0)
  327.         /* ファイルの新規作成をする場合を考えて、
  328.            エラーダイアログは出さない */
  329.         return -4;
  330.  
  331.     return 0;
  332. }
  333.